package middleware

import (
	"django_blog_gin/internal/utils"
	"fmt"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

func JWTMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 判断是否需要跳过 JWT 验证（例如检查路径或方法）
		fullPath := c.FullPath()
		fmt.Println("请求路径:", fullPath)
		if fullPath == "/api/check" || fullPath == "/api/login" || fullPath == "/api/refresh" {
			// 不需要验证，直接跳过
			c.Next()
			return
		}

		// 获取请求头中的 Authorization
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header required"})
			c.Abort()
			return
		}

		// 解析 Token，假设形式是 "Bearer <token>"
		if !strings.HasPrefix(authHeader, "Bearer ") {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid authorization format"})
			c.Abort()
			return
		}

		// 获取 token 部分
		tokenString := authHeader[len("Bearer "):]

		// 解析 JWT
		tokenMap, err := utils.ParseJwtToken(tokenString)

		// 必须要是account类型的令牌
		if tokenMap.Type != utils.AccountType {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token type"})
			c.Abort()
			return
		}

		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
			c.Abort()
			return
		}
		// token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		// 解析时使用密钥
		// return jwtSecret, nil
		// })

		// if err != nil || !token.Valid {
		// 	c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
		// 	c.Abort()
		// 	return
		// }

		// 将解析出的 claims 存入上下文，后续可以在处理函数中使用
		// if claims, ok := token.Claims.(*Claims); ok && token.Valid {
		c.Set("tokenData", tokenMap) // 存储用户名或其他信息

		c.Next()
	}
}
